﻿/*
 * Created by SharpDevelop.
 * User: Home
 * Date: 23/06/2008
 * Time: 9:34
 * 
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */

using System;
using System.IO;
using System.Drawing;
using csharp.rad.general;
using System.Windows.Forms;
using csharp.rad.sisponto.kernel;
using ComponentFactory.Krypton.Toolkit;

namespace csharp.rad.sisponto
{
	/// <summary>
	/// Description of frmImportarHorariosRelogioHenry.
	/// </summary>
	public partial class frmImportarHorariosRelogioHenry : KryptonForm
	{
		private Database bd;
		private HorariosFunc horarios;
		
		public frmImportarHorariosRelogioHenry(Database bd)
		{
			InitializeComponent();
			
			this.bd = bd;
			horarios = new HorariosFunc(bd);
		}
		
		private void BtnArquivoClick(object sender, EventArgs e)
		{
			String line, fileName;
			
			if( openFileDialogEntradas.ShowDialog() == DialogResult.OK )
			{
				fileName = openFileDialogEntradas.FileName;
				
				StreamReader myStreamReader;
				if (File.Exists(fileName))
				{
					myStreamReader = new StreamReader( new FileStream(fileName, FileMode.Open) );
					
					while ( ! myStreamReader.EndOfStream)
					{
						line = myStreamReader.ReadLine();
						
						mostraLinha(line);
					}
					dgvEntradas.Sort(new RowComparer());
					myStreamReader.Close();
				}
			}
			
			analisaEntradas();
		}
		
		private void mostraLinha(String line)
		{
			String relogio, sentido, data, hora, matricula;
			
			relogio   = line.Substring(0,2);
			sentido   = line.Substring(3,1);
			data      = line.Substring(12,10);
			hora      = line.Substring(23,8);
			matricula = line.Substring(32,20);
			
			dgvEntradas.Rows.Add(new String[]{"false",relogio,data,matricula,hora});
		}
		
		private void BtnSalvarClick(object sender, EventArgs e)
		{
			
		}
		
		private void importarEntradas()
		{
			Funcionario func = new Funcionario(bd);
			
			String codigo;
			DateTime aux = new DateTime();
			DateTime ant = new DateTime();
			TimeSpan hora;
			
			bd.BeginTransaction(System.Data.IsolationLevel.ReadCommitted);
			
			for( int  i = 0; i < dgvEntradas.Rows.Count; i++)
			{
				if( !Convert.ToBoolean(dgvEntradas.Rows[i].Cells["importar"].Value) )
					continue;
				Entrada entrada = new Entrada(bd);
				
				codigo = kernel.Functions.makeStringEsquerda(dgvEntradas.Rows[i].Cells["matricula"].Value.ToString(),20,'0');
				aux= Convert.ToDateTime(dgvEntradas.Rows[i].Cells["data"].Value.ToString());

				entrada.data    = aux;
				
				//Fecha o dia quando avança uma data
				if( i == 0)
					ant = aux;
				else
				{
					if( aux != ant)
					{
						entrada.fechaDiasAnteriores();
						ant = aux;
					}
				}
				
				//Busca o funcionário na lista
				func.id = func.getIdByCodigo(codigo);
				entrada.id_func = func.id;
				
				//Funcionário não cadastrado
				if( func.id <= 0)
				{
					KryptonMessageBox.Show("Funcionário com a matricula '"+codigo+"' não cadastrado!");
					bd.RollBackTransaction();
					return;
				}
				func.obter();
				
				horarios.getHorarioFunc(func.id_horario_func,aux);
				aux = Convert.ToDateTime(dgvEntradas.Rows[i].Cells["hora"].Value.ToString());
				hora = new TimeSpan(aux.Hour, aux.Minute, aux.Second);
				
				entrada.obter();
				//Eu, eu, eu, eu........
				if( entrada.darEntrada(hora, func, horarios.Current(), !chkBarrar.Checked) == CONSTANTS.ERROR)
				{
					KryptonMessageBox.Show("Erro: "+entrada.msg_erro);
					bd.RollBackTransaction();
					return;
				}
			}
			
			//FIXME: Fechar dia, quando e so um dia o programa n'ao esta fechando
			KryptonMessageBox.Show("Registros salvos com sucesso!!");
			bd.CommitTransaction();
		}
		
		private void FrmImportarHorariosRelogioHenryLoad(object sender, EventArgs e)
		{
			horarios.obterTodos();
		}
		
		private void BtnImportarClick(object sender, EventArgs e)
		{
			importarEntradas();
		}
		
		private void BtnCancelarClick(object sender, EventArgs e)
		{
			this.Close();
		}
		
		private void analisaEntradas()
		{
			int tam = dgvEntradas.Rows.Count;
			int j, count;
			Entrada ent;	
			Funcionario func = new Funcionario(bd);
			
			ent = new Entrada(bd);
			for(int i =0 ; i < tam; i++)
			{		
				ent.data=     Convert.ToDateTime(dgvEntradas.Rows[i].Cells["data"].Value.ToString());
				ent.id_func=  func.getIdByCodigo(kernel.Functions.makeStringEsquerda(dgvEntradas.Rows[i].Cells["matricula"].Value.ToString(),20,'0'));
				
				ent.obter();
				if(ent.situacao == Entrada.FECHADO)
				{
					dgvEntradas.Rows[i].DefaultCellStyle.BackColor = Color.Red;
					dgvEntradas.Rows[i].ReadOnly = true;
					continue;
				}
				
				count =0;
				j=i;
				while( (j < tam) && (dgvEntradas.Rows[i].Cells["data"].Value.Equals(dgvEntradas.Rows[j].Cells["data"].Value)))
				{
					if( dgvEntradas.Rows[i].Cells["matricula"].Value.Equals(dgvEntradas.Rows[j].Cells["matricula"].Value)
					   &&
					   !Convert.ToBoolean(dgvEntradas.Rows[j].Cells["importar"].Value)
					  )
					{
						dgvEntradas.Rows[j].Cells["importar"].Value = true;
						count++;
					}
					j++;
				}
				if (count % 2 != 0)
				{
					j--;
					while( j >= i)
					{
						if( dgvEntradas.Rows[i].Cells["matricula"].Value.Equals(dgvEntradas.Rows[j].Cells["matricula"].Value))
						{
							dgvEntradas.Rows[j].DefaultCellStyle.BackColor = Color.Yellow;
						}
						j--;
					}
					dgvEntradas.Rows[i].DefaultCellStyle.BackColor = Color.Yellow;
				}
			}
		}
		
		private  class RowComparer : System.Collections.IComparer
		{
			public int Compare(object x, object y)
			{
				DataGridViewRow row1 = (DataGridViewRow)x;
				DataGridViewRow row2 = (DataGridViewRow)y;
				
				int CompareResult = 0;
				
				//Tenta ordenar baseado nas celulas da coluna data
				DateTime data1 = Convert.ToDateTime(row1.Cells["data"].Value);
				DateTime data2 = Convert.ToDateTime(row2.Cells["data"].Value);
				
				CompareResult   = data1.CompareTo(data2);
				
				//Se as datas forem iguais ordena pela matricula
				if( CompareResult == 0 )
				{
					Int32 matricula1 = Convert.ToInt32(row1.Cells["matricula"].Value);
					Int32 matricula2 = Convert.ToInt32(row2.Cells["matricula"].Value);
					
					CompareResult = matricula1 - matricula2;
				}
				
				//Se as matriculas forem iguais então ordena pelo horário ( entrada )
				if( CompareResult == 0 )
				{
					data1 = Convert.ToDateTime( row1.Cells["hora"].Value);
					data2 = Convert.ToDateTime( row2.Cells["hora"].Value);
					TimeSpan hora1 = new TimeSpan( data1.Hour, data1.Minute, data1.Second );
					TimeSpan hora2 = new TimeSpan( data2.Hour, data2.Minute, data2.Second );
					
					CompareResult = hora1.CompareTo(hora2);
				}
				return CompareResult;
			}
		}
		
		void DgvEntradasCellMouseEnter(object sender, DataGridViewCellEventArgs e)
		{
		
			
		}
		
		void DgvEntradasCellToolTipTextNeeded(object sender, DataGridViewCellToolTipTextNeededEventArgs e)
		{
			if (dgvEntradas.Rows[e.RowIndex].DefaultCellStyle.BackColor == Color.Red)
				e.ToolTipText = String.Format("Funcionário já tem entrada neste dia!");
			else if (dgvEntradas.Rows[e.RowIndex].DefaultCellStyle.BackColor == Color.Yellow)
				e.ToolTipText = String.Format("Número de batidas incorreto para esse funcionário!");
		}
	}
}
